home *** CD-ROM | disk | FTP | other *** search
- unit MainForm;
-
- interface
-
- uses
- Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
- ComCtrls, StdCtrls, Menus, ExtCtrls, Db, DBTables;
-
- Const
- WM_GATHERSYSINFO = WM_USER+1000;
-
- type
- TTSIMainForm = class(TForm)
- PageControl1: TPageControl;
- TabSheet1: TTabSheet;
- SysInfo: TMemo;
- TabSheet2: TTabSheet;
- GroupBox1: TGroupBox;
- Label1: TLabel;
- CurrentProcessID: TEdit;
- Label2: TLabel;
- ConvertProcessID: TEdit;
- ShowSession: TButton;
- MainMenu1: TMainMenu;
- Information1: TMenuItem;
- RefreshSystemInfo1: TMenuItem;
- N1: TMenuItem;
- Exit1: TMenuItem;
- GroupBox2: TGroupBox;
- SessionRefreshTimer: TTimer;
- TSSessions: TListView;
- ShowSessionInfo: TButton;
- RefreshSessions: TCheckBox;
- SendMsgToSession: TButton;
- TabSheet3: TTabSheet;
- ProcessList: TListView;
- RefreshProcesses: TButton;
- ProcessCount: TLabel;
- TabSheet4: TTabSheet;
- GroupBox3: TGroupBox;
- CreateMutex: TButton;
- OpenMutex: TButton;
- Label3: TLabel;
- MutexNamePrefix: TComboBox;
- GroupBox4: TGroupBox;
- Label4: TLabel;
- BDEAlias: TComboBox;
- Label5: TLabel;
- SQLStatement: TMemo;
- ExecuteQuery: TButton;
- CloseMutex: TButton;
- SQLQuery: TQuery;
- procedure FormShow(Sender: TObject);
- procedure ShowSessionClick(Sender: TObject);
- procedure RefreshSystemInfo1Click(Sender: TObject);
- procedure Exit1Click(Sender: TObject);
- procedure SessionRefreshTimerTimer(Sender: TObject);
- procedure ShowSessionInfoClick(Sender: TObject);
- procedure SendMsgToSessionClick(Sender: TObject);
- procedure RefreshProcessesClick(Sender: TObject);
- procedure CreateMutexClick(Sender: TObject);
- procedure OpenMutexClick(Sender: TObject);
- procedure CloseMutexClick(Sender: TObject);
- procedure ExecuteQueryClick(Sender: TObject);
- private
- { Private declarations }
- Mutex : THandle;
- Procedure GatherSysInfo(Var Msg); Message WM_GATHERSYSINFO;
- public
- { Public declarations }
- end;
-
- var
- TSIMainForm: TTSIMainForm;
-
- implementation
-
- uses SystemInfo, TerminalServices, TypInfo;
-
- {$R *.DFM}
-
- procedure TTSIMainForm.FormShow(Sender: TObject);
- begin
- PageControl1.ActivePageIndex := 0;
- PostMessage(Handle,WM_GATHERSYSINFO,0,0);
- CurrentProcessID.Text := IntToStr(GetCurrentProcessId);
- end;
-
- procedure TTSIMainForm.GatherSysInfo(var Msg);
- begin
- With SysInfo,Lines do Begin
- Clear;
- Add(GetTerminalServicesInfo); Add('');
- Add(GetSystemInfo); Add('');
- Add(GetTimeAndDateInfo); Add('');
- Add(GetKeyboardLayoutInfo); Add('');
- Add(GetAudioDeviceInfo); Add('');
- Add(GetMiscInfo); Add('');
- Add(GetWinSockInfo); Add('');
- Add(GetInternetConnectionInfo);
- { bring cursor back to top }
- SelStart := 0;
- Perform(EM_SCROLLCARET,0,0);
- End;
- end;
-
- procedure TTSIMainForm.ShowSessionClick(Sender: TObject);
- Var SessionID : Integer;
- begin
- If (Not ProcessIdToSessionId(StrToInt(ConvertProcessID.Text),SessionID)) Then
- RaiseLastWin32Error;
- ShowMessage('Process ID: '+ConvertProcessID.Text+#13+
- 'Session ID: '+IntToStr(SessionID));
- end;
-
- procedure TTSIMainForm.RefreshSystemInfo1Click(Sender: TObject);
- begin
- PageControl1.ActivePageIndex := 0;
- SysInfo.Lines.Text := 'Please wait...';
- PostMessage(Handle,WM_GATHERSYSINFO,0,0);
- end;
-
- procedure TTSIMainForm.Exit1Click(Sender: TObject);
- begin
- Close;
- end;
-
- procedure TTSIMainForm.SessionRefreshTimerTimer(Sender: TObject);
- Var
- S : String;
- P : PSessionInfoArray;
- I,J : Integer;
- TI : Pointer;
-
- begin
- If (Not RefreshSessions.Checked) Then Exit;
- { update session states }
- If (Not WTSEnumerateSessions(WTS_CURRENT_SERVER_HANDLE,0,1,P,I)) Then Begin
- SessionRefreshTimer.Enabled := False;
- PageControl1.ActivePageIndex := 1;
- TSSessions.SetFocus;
- RaiseLastWin32Error;
- End;
- TSSessions.Items.Clear;
- For J := 0 to I-1 do Begin
- {$R-}
- TI := TypeInfo(TConnectState);
- S := GetEnumName(TI,Integer(P^[J].State));
- With TSSessions.Items.Add do Begin
- Caption := IntToStr(P^[J].SessionID);
- SubItems.Add(P^[J].WindowStation);
- SubItems.Add(S);
- End;
- {$R+}
- End;
- WTSFreeMemory(P);
- end;
-
- procedure TTSIMainForm.ShowSessionInfoClick(Sender: TObject);
- Const
- InfoNames : Array[WTSInitialProgram..WTSClientProtocolType] of String =
- ('Initial Program','Application Name','Working Directory',
- 'OEM ID','Session ID','User Name','Window Station Name',
- 'Domain Name','Connect State','Client Build Number',
- 'Client Name','Client Directory','Client Product ID',
- 'Client Hardware ID','Client Address Family',
- 'Client Display','Client ProtocolType');
-
- Var
- Session : LongWord;
- Info : TInfoClass;
- Buf : Pointer;
- S,T : String;
- I : Integer;
-
- begin
- If (TSSessions.Selected = nil) Then Session := WTS_CURRENT_SESSION
- Else Session := StrToInt(TSSessions.Selected.Caption);
- { call WTSQuerySessionInformation repeatedly }
- S := '';
- For Info := WTSInitialProgram to WTSClientProtocolType do Begin
- If (Not WTSQuerySessionInformation(WTS_CURRENT_SERVER_HANDLE,
- Session,Info,Buf,I)) Then RaiseLastWin32Error;
- S := S+InfoNames[Info]+': ';
- If (Buf <> nil) Then Begin
- Case Info of
- WTSApplicationName,
- WTSClientDirectory,
- WTSClientName,
- WTSDomainName,
- WTSInitialProgram,
- WTSOEMId,
- WTSUserName,
- WTSWinStationName,
- WTSWorkingDirectory : S := S+PChar(Buf)+#13;
- WTSClientBuildNumber,
- WTSClientHardwareId,
- WTSConnectState,
- WTSClientAddress,
- WTSSessionId : S := S+IntToStr(PInteger(Buf)^)+#13;
- WTSClientProductId,
- WTSClientProtocolType : S := S+IntToStr(PByte(Buf)^)+#13;
- WTSClientDisplay : Begin
- T := IntToStr(PInteger(Buf)^)+' x ';
- Buf := Pointer(Integer(Buf)+SizeOf(Integer));
- T := T+IntToStr(PInteger(Buf)^)+' @ ';
- Buf := Pointer(Integer(Buf)+SizeOf(Integer));
- T := T+IntToStr(PInteger(Buf)^)+'-bit';
- S := S+T+#13;
- End;
- End;
- WTSFreeMemory(Buf);
- End;
- End;
- ShowMessage(S);
- end;
-
- procedure TTSIMainForm.SendMsgToSessionClick(Sender: TObject);
- Var
- Session : LongWord;
- Title : String;
- AMessage : String;
- I : Integer;
-
- begin
- If (TSSessions.Selected = nil) Then Begin
- ShowMessage('Please select a session first.');
- Exit;
- End;
- Session := StrToInt(TSSessions.Selected.Caption);
- Title := 'Hello Session #'+IntToStr(Session);
- AMessage := 'It is now: '+DateTimeToStr(Now);
- If (Not WTSSendMessage(WTS_CURRENT_SERVER_HANDLE,Session,
- PChar(Title),Length(Title),PChar(AMessage),Length(AMessage),MB_OK,
- 0,I,False)) Then RaiseLastWin32Error;
- ShowMessage('Message sent.');
- end;
-
- Function SIDToUserName(SID : PSID) : String;
- Var
- Name : Array[0..256] of Char;
- NLen : Cardinal;
- Dom : Array[0..256] of Char;
- DLen : Cardinal;
- SType : Cardinal;
-
- begin
- If (SID = nil) Then Result := 'SYSTEM'
- Else Begin
- NLen := SizeOf(Name);
- DLen := SizeOf(Dom);
- If (Not LookupAccountSid(nil,SID,Name,NLen,Dom,DLen,SType)) Then
- Result := '(unknown)'
- Else Result := StrPas(Name);
- End;
- end;
-
- procedure TTSIMainForm.RefreshProcessesClick(Sender: TObject);
- Var
- P : PProcessInfoArray;
- I,J : Integer;
-
- begin
- If (Not WTSEnumerateProcesses(WTS_CURRENT_SERVER_HANDLE,0,1,P,I)) Then
- RaiseLastWin32Error;
- ProcessList.Items.Clear;
- ProcessCount.Caption := IntToStr(I)+' processes shown';
- For J := 0 to I-1 do Begin
- {$R-}
- With ProcessList.Items.Add do Begin
- Caption := IntToStr(P^[J].ProcessID);
- SubItems.Add(IntToStr(P^[J].SessionID));
- If (P^[J].ProcessName = nil) Then SubItems.Add('-')
- Else SubItems.Add(P^[J].ProcessName);
- SubItems.Add(SIDToUserName(P^[J].UserSID));
- End;
- {$R+}
- End;
- WTSFreeMemory(P);
- end;
-
- procedure TTSIMainForm.CreateMutexClick(Sender: TObject);
- begin
- Mutex := Windows.CreateMutex(nil,False,
- PChar(MutexNamePrefix.Text+'terminalserviceinfo-mutex-1.0'));
- If (Mutex <> 0) Then ShowMessage('Mutex created.')
- Else RaiseLastWin32Error;
- end;
-
- procedure TTSIMainForm.OpenMutexClick(Sender: TObject);
- begin
- Mutex := Windows.OpenMutex(MUTEX_ALL_ACCESS,False,
- PChar(MutexNamePrefix.Text+'terminalserviceinfo-mutex-1.0'));
- If (Mutex = 0) Then RaiseLastWin32Error;
- ShowMessage('Mutex opened OK.');
- end;
-
- procedure TTSIMainForm.CloseMutexClick(Sender: TObject);
- begin
- If (Mutex = 0) Then ShowMessage('Nothing to close.')
- Else Begin
- CloseHandle(Mutex);
- Mutex := 0;
- ShowMessage('Mutex closed.');
- End;
- end;
-
- procedure TTSIMainForm.ExecuteQueryClick(Sender: TObject);
- begin
- With SQLQuery do Begin
- Close;
- DatabaseName := BDEAlias.Text;
- SQL.Assign(SQLStatement.Lines);
- Open;
- Last;
- ShowMessage('Query executed, '+IntToStr(RecordCount)+' rows.');
- Close;
- End;
- end;
-
- end.
-